package main

import (
	"github.com/gorilla/websocket"
	"log"
	"sync"
	"time"
)

// 消息类型
const (
	MessageTypeText = iota
	MessageTypeJoin
	MessageTypeLeave

	MessageTypeGameOp       = 100 // 玩家操作（如方向变更、准备、开始）
	MessageTypeGameState    = 101 // 游戏状态同步
	MessageTypeReadyChanged = 102 // 准备状态变更
)

// WebSocket消息结构
type Message struct {
	ID       string          `json:"id"`
	Type     int             `json:"type"`
	UserID   string          `json:"user_id"`
	UserName string          `json:"user_name"`
	Content  string          `json:"content"`
	Time     int64           `json:"time"`
	ReadBy   map[string]bool `json:"read_by,omitempty"`
}

// 蛇的单节
type SnakeSegment struct {
	X int `json:"x"`
	Y int `json:"y"`
}

// 单个玩家的蛇
type Snake struct {
	Segments  []SnakeSegment `json:"segments"`
	Direction string         `json:"direction"`
	Alive     bool           `json:"alive"`
}

// 游戏状态
type SnakeGameState struct {
	Snakes map[string]*Snake `json:"snakes"` // userID -> Snake
	Foods  []SnakeSegment    `json:"foods"`
	Scores map[string]int    `json:"scores"` // userID -> score
	Status string            `json:"status"` // "waiting", "playing", "gameover"
	Ready  map[string]bool   `json:"ready"`  // userID -> ready
}

// 房间结构
type Room struct {
	ID          string
	Name        string
	CreatorID   string
	CreatorName string
	Clients     map[string]*Client
	Messages    []*Message
	UserNames   map[string]string // user_id -> user_name
	JoinTimes   map[string]int64  // user_id -> join_time
	Ready       map[string]bool   // user_id -> ready status
	mu          sync.RWMutex
	MaxUsers    int          // 新增：最大人数
	gameMu      sync.RWMutex // 游戏状态专用锁

	// Snake game
	GameState    *SnakeGameState
	gameTicker   *time.Ticker
	stopGame     chan struct{}
	destroyTimer *time.Timer      // 新增：自动销毁定时器
	wsServer     *WebSocketServer // 新增：持有wsServer指针

	MessageCount int       // 消息总数
	ActiveTime   int64     // 活跃时间（秒）
	CreationTime time.Time // 创建时间
}

// 客户端结构
type Client struct {
	UserID   string
	UserName string
	Conn     *websocket.Conn
	Send     chan []byte
	mu       sync.Mutex // 添加互斥锁，保护连接写入
}

// 在import后添加唯一RoomInfo声明：
// 房间信息
type RoomInfo struct {
	ID       string `json:"id"`
	Name     string `json:"name"`
	NumUsers int    `json:"num_users"`
	MaxUsers int    `json:"max_users"`
}

// 增加统计信息收集
func (r *Room) startStatsCollector() {
	ticker := time.NewTicker(5 * time.Minute)
	defer ticker.Stop()

	for {
		select {
		case <-ticker.C:
			r.ActiveTime += 300 // 5分钟
			log.Printf("房间 %s 统计: 在线用户=%d, 消息总数=%d, 活跃时间=%d分钟",
				r.ID, len(r.Clients), r.MessageCount, r.ActiveTime/60)
		}
	}
}
